interface characterMap {
  1: "1"
  2: "2"
  3: "3"
  4: "4"
  5: "5"
  6: "6"
  7: "7"
  8: "8"
  9: "9"
  0: "0"
  q: "Q"
  w: "W"
  e: "E"
  r: "R"
  t: "T"
  y: "Y"
  u: "U"
  i: "I"
  o: "O"
  p: "P"
  a: "A"
  s: "S"
  d: "D"
  f: "F"
  g: "G"
  h: "H"
  j: "J"
  k: "K"
  l: "L"
  z: "Z"
  x: "X"
  c: "C"
  v: "V"
  b: "B"
  n: "N"
  m: "M"
  [key: string]: string
}

type char =
  | "1"
  | "2"
  | "3"
  | "4"
  | "5"
  | "6"
  | "7"
  | "8"
  | "9"
  | "0"
  | "q"
  | "w"
  | "e"
  | "r"
  | "t"
  | "y"
  | "u"
  | "i"
  | "o"
  | "p"
  | "a"
  | "s"
  | "d"
  | "f"
  | "g"
  | "h"
  | "j"
  | "k"
  | "l"
  | "z"
  | "x"
  | "c"
  | "v"
  | "b"
  | "n"
  | "m"

type RestChars<T> = T extends `${char}${infer P}` ? P : ""

type UpperFirst<T> = T extends `${infer P}${string}`
  ? `${characterMap[P]}${RestChars<T>}`
  : T

export function createKey<P extends string, S extends string>(
  prefix: P,
  suffix: S
): S extends "default" ? P : `${P}${UpperFirst<S>}` {
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
  return (prefix +
    (suffix === "default"
      ? ""
      : suffix.replace(/^[a-z]/, (startChar) =>
          startChar.toUpperCase()
        ))) as any
}
